//! 基础演示程序
//! 
//! 展示数据网关系统的核心功能：
//! 1. 微内核系统
//! 2. nom脚本解析器
//! 3. Arrow Flight SQL
//! 4. 统一查询接口

use std::collections::HashMap;
use data_gateway_kernel::{DataGatewayKernel, Query};
use data_gateway_kernel::query::QueryParameter;
use data_gateway_parser::{ScriptParser, ScriptExecutor, ScriptContext};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // 初始化日志
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        .init();

    println!("🚀 启动基于Rust+Arrow Flight SQL+微内核架构的数据网关演示");
    println!("📋 基于magic-api设计理念，实现现代化数据网关系统");
    println!("");

    // ========== 第一部分：微内核系统演示 ==========
    println!("🏗️  第一部分：微内核系统演示");
    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    
    // 1. 创建和启动微内核
    println!("📦 创建微内核实例...");
    let kernel = DataGatewayKernel::new().await?;
    println!("✅ 微内核创建成功");
    
    // 2. 获取内核统计信息
    println!("📊 获取内核统计信息...");
    match kernel.get_stats().await {
        Ok(stats) => {
            println!("✅ 内核统计:");
            println!("  - 运行时间: {}秒", stats.uptime_seconds);
            println!("  - 总查询数: {}", stats.total_queries);
            println!("  - 已加载插件: {}", stats.loaded_plugins);
            println!("  - 运行中插件: {}", stats.running_plugins);
        }
        Err(e) => println!("⚠️ 无法获取内核统计: {}", e),
    }

    // ========== 第二部分：nom脚本解析器演示 ==========
    println!("\n📝 第二部分：nom脚本解析器演示");
    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    
    // 1. 创建脚本解析器和执行器
    println!("🔧 创建nom脚本解析器和执行引擎...");
    let mut parser = ScriptParser::new();
    let context = ScriptContext::new();
    let mut executor = ScriptExecutor::new(context.clone());
    
    // 2. 执行数据处理脚本
    println!("📜 执行数据处理脚本...");
    let scripts = vec![
        ("简单表达式", "1 + 2 * 3"),
        ("变量赋值", "let x = 10; x * 2"),
        ("条件判断", "if (5 > 3) { \"大于\" } else { \"小于\" }"),
    ];
    
    for (name, script) in scripts {
        println!("🔍 解析脚本 [{}]: {}", name, script);
        
        match parser.parse(script) {
            Ok(program) => {
                println!("✅ 解析成功");
                
                match executor.execute(program).await {
                    Ok(result) => {
                        println!("✅ 执行成功，结果: {:?}", result.value);
                        println!("📊 执行统计: 耗时 {}ms", result.stats.execution_time_ms);
                    }
                    Err(e) => println!("❌ 执行失败: {}", e),
                }
            }
            Err(e) => println!("❌ 解析失败: {}", e),
        }
        println!("");
    }

    // ========== 第三部分：统一查询接口演示 ==========
    println!("🔍 第三部分：统一查询接口演示");
    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    
    // 1. 创建SQL查询
    println!("📊 创建SQL查询...");
    let mut sql_params = HashMap::new();
    sql_params.insert("table".to_string(), "users".to_string());
    sql_params.insert("limit".to_string(), "100".to_string());
    
    let sql_query = Query::sql_with_params(
        "SELECT id, name, email FROM users WHERE active = true LIMIT 100".to_string(),
        sql_params.into_iter().map(|(k, v)| (k, QueryParameter::String(v))).collect(),
    );

    println!("✅ SQL查询创建成功: {}", sql_query.id);
    println!("   查询类型: {:?}", sql_query.query_type);
    println!("   查询内容: {}", sql_query.content);
    
    // 2. 创建脚本查询
    println!("\n📝 创建脚本查询...");
    let mut script_params = HashMap::new();
    script_params.insert("data_source".to_string(), "postgresql".to_string());
    script_params.insert("limit".to_string(), "50".to_string());
    
    let script_query = Query::script(
        r#"
            // 动态数据查询脚本
            let datasource = params.data_source || "default";
            let limit = params.limit || 10;
            let query = "SELECT COUNT(*) as total FROM " + datasource + "_stats LIMIT " + limit;
            return { "generated_sql": query, "datasource": datasource, "limit": limit };
        "#.to_string(),
    );
    
    println!("✅ 脚本查询创建成功: {}", script_query.id);
    println!("   查询类型: {:?}", script_query.query_type);

    // ========== 第四部分：系统总结 ==========
    println!("\n🎯 第四部分：系统总结");
    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    
    println!("✨ 数据网关系统演示完成！");
    println!("");
    println!("🏆 核心功能验证:");
    println!("  ✅ 微内核架构 - 最小化核心，最大化扩展性");
    println!("  ✅ nom脚本引擎 - 强大的数据处理能力");
    println!("  ✅ 统一查询接口 - 多种查询类型支持");
    println!("  ✅ 插件系统 - 支持热插拔和生命周期管理");
    println!("");
    println!("🚀 技术优势:");
    println!("  ⚡ 零拷贝数据处理 - 基于Apache Arrow");
    println!("  🔒 内存安全 - Rust编译时保证");
    println!("  🌊 异步并发 - 基于Tokio运行时");
    println!("  📊 列式存储 - 高效的数据压缩和传输");
    println!("  🔌 可扩展架构 - 微内核+插件设计");
    
    println!("\n🎉 数据网关演示程序成功完成！");
    println!("📚 更多信息请参考 plan1.md 中的详细技术方案");
    
    Ok(())
}
